package code.ws_common_scene.mode.base
{
	
	import code.StarlingMain;
	import code.ws_common_ems.EffectPosEms;
	import code.ws_common_ems.ModeActionEms;
	import code.ws_common_ems.ModeRenderEms;
	import code.ws_common_ems.ModeStatusEms;
	import code.ws_common_scene.eft.EViewClip;
	import code.ws_common_scene.eft.Effects;
	import code.ws_common_scene.mode.inters.ISprite;
	import code.ws_common_scene.texturedata.ModeTextureDataPool;
	import code.ws_common_scene.texturedata.TexturePlayData;
	import code.ws_common_utils.MathUtils;
	
	import flash.geom.Point;
	import flash.utils.Dictionary;
	
	import starling.core.Starling;
	import starling.display.DisplayObject;
	import starling.display.Image;
	import starling.display.Sprite;
	import starling.text.TextField;
	import starling.utils.Color;
	import starling.utils.HAlign;

	/**
	 * 模型基类 
	 * @author qiangchen
	 * 
	 */	
	public class BRole extends Sprite implements ISprite
	{
		/** id */
		private var _showid:int;
		/** 渲染类型 */
		private var _render:String = null;
		/** 样式 */
		private var _style:String = null;
		/** 动作 */
		private var _action:String = null;
		/** 状态 */
		private var _status:String = null;
		/** 方向 */
		private var _dir:int = 0;
		/** 名字 */
		private var _name:String = null;
		/** 移动速度 */
		private var _speed:Number = NaN;
		/** 默认点 */
		private const dPoint:Point = new Point( 0, 0 );
		/** 逻辑点 */
		private var _tile:Point = dPoint;
		/** 头顶容器 */
		private var _topCons:Sprite = null;
		/** 身体容器 */
		private var _bodyCons:Sprite = null;
		/** 脚底容器 */
		private var _footCons:Sprite = null;
		/** 模型刷新器 */
		private var _aView:ViewClip = null;
		/** 名字文本 */
		private var _nameTxt:TextField = null;
		/** 脚底阴影 */
		private var _shadow:Image = null;
		/** 选中标识符 */
		private var _selectImg:Image = null;
		/** 特效管理器 */
		private var _eftDic:Dictionary = new Dictionary();
		
		
		/**
		 * 构造函数 
		 * @param render
		 * @param style
		 * @param action
		 * @param dir
		 * 
		 */		
		public function BRole( render:String, style:String, action:String, dir:int )
		{
			_render = render;
			_style = style;
			_action = action;
			_dir = dir;
			
			// 头部，胸部，脚部容器初始化
			_topCons = new Sprite();
			_bodyCons =  new Sprite();
			_footCons = new Sprite();
			_topCons.touchable = _bodyCons.touchable = _footCons.touchable = false;
			addChild( _footCons );
			addChild( _bodyCons );
			addChild( _topCons );
			
			// 动作刷新器
			_aView = new ViewClip();
			_aView.touchable = false;
			_aView.ini( selfRender, style, action, dir );
			_bodyCons.addChild( _aView );
			
			// 脚底阴影
			_shadow = new Image( StarlingMain.instance.assets.getTexture("shadow") );
			_shadow.touchable = false;
			_footCons.addChild( _shadow );
			_shadow.x = -_shadow.width >> 1;
			_shadow.y = -_shadow.height >> 1;
			
			// 名字文本
			_nameTxt = new TextField( 155, 22, "", "Verdana", 15, Color.WHITE , true);
			_nameTxt.touchable = false;
			_nameTxt.hAlign = HAlign.CENTER;
			_topCons.addChild( _nameTxt );
			
			// 设置头顶位置
			setTopConsPos( action );
		}
		
		
		/**
		 * 设置名字
		 * @param name
		 * 
		 */
		public function setName( name:String ):void
		{
			_name =  ( name == null || name == "" ) ? "" : name;
			_nameTxt.text = _name;
			_nameTxt.x = - int( _nameTxt.width * .5 );
			// 设置头顶位置
			setTopConsPos( action );
			name = null;
		}
		
		
		/**
		 * 设置头顶内部元件位置 （从上至下排列）
		 * 
		 */		
		public function setTopConsInnerPos():void
		{
			var lens:int = _topCons.numChildren -1;
			var dis:DisplayObject;
			var finalPos:int = 0;
			var i:int = 0;
			while( i <= lens )
			{
				dis = _topCons.getChildAt( i );
				dis.y = finalPos;
				finalPos += dis.height;
				i++;
			}
			lens = NaN, finalPos = NaN, i = NaN;
			dis = null;
		}
		
		
		/**
		 * 设置头顶位置 
		 * @param _action
		 * 
		 */		
		public function setTopConsPos( _action:String ):void
		{
			var playData:TexturePlayData = ModeTextureDataPool.getPlayData( selfRender, style, action, direction );
			if( playData == null )
			{
				_topCons.y = 0;
				return;
			}
			
			_topCons.y = playData.maxY - _topCons.height;
		}
		
		
		
		/**
		 * 设置方向 
		 * @param dir
		 * 
		 */		
		public function setDirection( dir:int ):void
		{
			if( dir < 0 || dir > 7 )
			{
				// 错误方向
				return;
			}
			
			if( dir == this.direction )
			{
				// 同方向
				return;
			}
			
			_dir = dir;
			_aView.setDirection( _dir );
			setTopConsPos( action );
		}
		
		
		/**
		 * 设置动作 
		 * @param action 动作名
		 * @param fnUpdata 在动作播放一循环过程中时，需实时刷新的方法（默认：null）
		 * @param fnCom 在动作播放一循环后的回调方法（默认：null）
		 */		
		public function setAction( action:String, fnUpdata:Function=null, fnCom:Function=null ):void
		{
			if( action == null || action == "" || action == this.action )
			{
				// 同样的动作
				return;
			}
			_action = action;
			_aView.setAction( _action, fnUpdata, fnCom );
			setTopConsPos( _action );
		}
		
		
		/**
		 * 设置状态 
		 * @param status
		 * 
		 */		
		public function setStatus( status:String ):void
		{
			if( status == null || status == "" )
			{
				_status = ModeStatusEms.STAND;
				return;
			}
			
			_status = status;
		}
		
		
		
		/**
		 * 待机 
		 * 
		 */		
		public function stand():void
		{
			if( status == ModeStatusEms.STAND )
			{
				return;
			}
			setStatus( ModeStatusEms.STAND );
			setAction( ModeActionEms.STAND );
		}
		
		
		/**
		 * 移动 
		 * @param path
		 * 
		 */		
		public function walk( path:Array = null ):void
		{
			if( status == ModeStatusEms.WALK )
			{
				return;
			}
			setStatus( ModeStatusEms.WALK );
			setAction( ModeActionEms.WALK );
		}
		
		
		/**
		 * 添加选中 
		 * 
		 */		
		public function addSelect():void
		{
			if( this.selfRender == ModeRenderEms.MONSTER )
			{
				_selectImg = new Image( StarlingMain.instance.assets.getTexture("selEnemy" ) );
				_footCons.addChildAt( _selectImg, 1 );
				_selectImg.x = - _selectImg.width >> 1;
				_selectImg.y = - _selectImg.height >> 1;
			}
		}
		
		/**
		 * 移除选中 
		 * 
		 */		
		public function removeSelect():void
		{
			if( _selectImg )
			{
				_selectImg.dispose();
				_selectImg.parent && _selectImg.parent.removeChild( _selectImg, true );
				_selectImg = null;
			}
		}
		
		
		/**
		 * 添加特效 
		 * @param style	特效样式
		 * @param id		特效索引值id
		 * @param pos		特效添置的位置（默认：1，胸部位置；详情查看特效位置常量表）
		 * @param isLive	是否常驻（默认：false，循环一次后进行删除；如果为true，在必要删除时需手动移动）
		 */		
		public function addEfts( style:String, id:String, pos:int = 1, isLive:Boolean=false ):void
		{
			if( _eftDic[ id ] )
			{
				removeEfts( id );
			}
			
			_eftDic[ id ] = new Effects( style, id );
			if( pos == EffectPosEms.HEAD )
			{
				this.topCons.addChild( _eftDic[ id ] );
			}
			else if( pos == EffectPosEms.BODY )
			{
				this.bodyCons.addChild( _eftDic[ id ] );
				_eftDic[id].y -= 20;
			}
			else if( pos == EffectPosEms.FOOT )
			{
				this.footCons.addChild( _eftDic[ id ] );
			}
			else
			{
				this.bodyCons.addChild( _eftDic[ id ] );
			}
			
			if( !isLive )
			{
				Starling.juggler.tween( _eftDic[id], (_eftDic[id]._viewClip as EViewClip ).playData.totalTime / 1000, { onComplete:removeEfts, onCompleteArgs:[id] } );
			}
		}
		
		
		/**
		 * 移除特效 
		 * @param id	特效索引值
		 * 
		 */		
		public function removeEfts( id:String ):void
		{
			if( !_eftDic[ id ] ) return;
			
			Starling.juggler.removeTweens( _eftDic[ id ] );
			
			_eftDic[ id ].dispose();
			_eftDic[ id ].parent && _eftDic[ id ].parent.removeChild( _eftDic[ id ], true );
			_eftDic[ id ] = null;
			delete _eftDic[ id ];
		}
		
		
		/**
		 * 刷新 
		 * 
		 */		
		public function refresh():void
		{
			if( _aView )
			{
				_aView.refresh();	
			}
			
			for( var props:String in _eftDic )
			{
				if( props && _eftDic[props] )
				{
					_eftDic[props].refresh();
				}
			}
		}
		
		
		/**
		 * 设置id 
		 * @param val
		 * 
		 */		
		public function set showid( val:int ):void
		{
			_showid = val;
		}
		public function get showid():int
		{
			return _showid;
		}
		
		/**
		 * 设置逻辑点 
		 * @param p
		 * 
		 */		
		public function set tiles( p:Point ):void
		{
			if( p == null )
			{
				_tile = dPoint;
				return;
			}
			_tile = p;
		}
		/**
		 * 获取逻辑点 
		 * @return 
		 * 
		 */		
		public function get tiles():Point
		{
			return _tile;
		}
		
		
		/**
		 * 设置移动速度 
		 * @param speed
		 * 
		 */		
		public function setMoveSpeed( speed:int ):void
		{
			// 如果参数speed为0，那么启用默认移动速度160；
			_speed = ( speed == 0 ) ? MathUtils.defaultSpeed : speed;
		}
		
		
		
		/**
		 * 获取模型名字 
		 * @return 
		 * 
		 */		
		public function get thisName():String
		{
			return _name;
		}
		
		/**
		 * 获取当前动作 
		 * @return 
		 * 
		 */		
		public function get action():String
		{
			return _action;
		}
		
		
		/**
		 * 获取状态 
		 * @return 
		 * 
		 */		
		public function get status():String
		{
			return _status;
		}
		
		
		/**
		 * 获取渲染类型 
		 * @return 
		 * 
		 */		
		public function get selfRender():String
		{
			return _render;
		}
		
		/**
		 * 获取当前皮肤样式 
		 * @return 
		 * 
		 */		
		public function get style():String
		{
			return _style;
		}
		
		
		/**
		 * 获取当前方向 
		 * @return 
		 * 
		 */		
		public function get direction():int
		{
			return _dir;
		}
		
		
		/**
		 * 获取移动速度 
		 * @return 
		 * 
		 */		
		public function get moveSpeed():int
		{
			return _speed;
		}
		
		
		/**
		 * 获取头顶容器 
		 * @return 
		 * 
		 */		
		public function get topCons():Sprite
		{
			return _topCons;
		}
		
		/**
		 * 获取身体容器 
		 * @return 
		 * 
		 */		
		public function get bodyCons():Sprite
		{
			return _bodyCons;
		}
		
		
		/**
		 * 获取脚底容器 
		 * @return 
		 * 
		 */		
		public function get footCons():Sprite
		{
			return _footCons;
		}
		
		
		/**
		 * 获取名字文本对象 
		 * @return 
		 * 
		 */		
		public function get nametxt():TextField
		{
			return _nameTxt;
		}
		
		
		/**
		 * 释放 
		 * [自身在内存中的标记需手动置空]
		 */		
		override public function dispose():void
		{
			// 引用释放
			_name = null;
			_style = null;
			_action = null;
			_status = null;
			_speed = NaN;
			_dir = -1;
			_tile = null;
			_render = null;
			
			// 释放所有特效的引用
			for( var props:String in _eftDic )
			{
				if( props && _eftDic[props] )
				{
					_eftDic[props].dispose();
					_eftDic[props].parent && _eftDic[props].parent.removeChild( _eftDic[props], true );
					_eftDic[props] = null;
					delete _eftDic[props];
				}
				props = null;
			}
			_eftDic = null;
			
			// 动作刷新器释放
			_aView.die();
			
			super.dispose();
		}
	}
}